package leetcode;

import java.util.ArrayList;

import org.junit.Test;

public class GrayCode {

	public ArrayList<Integer> grayCode(int n) {
		ArrayList<Integer> res = new ArrayList<Integer>(1 << n);

		if (n != 0) {
			res.add(0);
			res.add(1);

			for (int i = 2; i <= n; ++i) {
				int start = 1 << (i - 1), end = 1 << i;

				for (int j = start; j < end; ++j) {
					res.add(res.get(end - j - 1) + start);
				}
			}
		} else
			res.add(0);

		return res;
	}

	@Test
	public void testResult() {
		GrayCode gc = new GrayCode();
		System.out.println(gc.grayCode(10));
		System.out.println(-1 >>> 48);
	}
}
